//
//  HMPictureView.swift
//  WeiBo
//
//  Created by apple on 16/6/27.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import SDWebImage


///  视图和cell的间距
let HMPictrueViewMargin: CGFloat = 10
/// item间距
let HMPictureItemMargin: CGFloat = 5
/// item的宽和高
let  HMPictureItemWH   = (UIScreen.mainScreen().bounds.width - 2 * HMPictrueViewMargin - 2 * HMPictureItemMargin) / 3

let HMPictureViewReuseIdentifier = "HMPictureViewReuseIdentifier"

class HMPictureView: UICollectionView {

    
    // 配图的宽高,是由有多少张图片决定
    var pic_urls: [HMPhotoViewModel]?{
    
        didSet{
            
//            print(pic_urls?.count)
            
            // 有了图片之后,再去更新一下 配图视图的宽和高
            let size = calcSize()
            
            
            self.snp_updateConstraints { (make) -> Void in
                
                make.width.equalTo(size.width)
                make.height.equalTo(size.height)
                
            }
            
            // 赋值之后,刷新数据
            reloadData()
            

        }
        
    }
    
    
   // UICollectionView must be initialized with a non-nil layout parameter
    
    var flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    // 一定要给 layout 设置值
    // init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) 是 UICollectionView的指定构造函数
    
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: flowLayout)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    private func setupUI(){
        
        dataSource = self
        delegate = self
        
        // 注册cell
        self.registerClass(HMPictureCollectionViewCell.self, forCellWithReuseIdentifier: HMPictureViewReuseIdentifier)
        
        // 设置itemsize
        flowLayout.itemSize = CGSizeMake(HMPictureItemWH, HMPictureItemWH)
        flowLayout.minimumInteritemSpacing = HMPictureItemMargin
        flowLayout.minimumLineSpacing = HMPictureItemMargin
        
    }
    //MARK:-- 定义一个方法来计算宽和高
    // 我们为了验证思路,可以把这个方法里边的实现当做一个黑盒来处理
    // 我们好多时候(例如: 读代码或者实现功能),不一定都要把所有的方法都显示了再去检验,可以来一个简单的小测试
    
    private func calcSize() -> CGSize{
        
        /*
            图片大小的逻辑
            1张图片的时候:显示的是实际图片的大小,先可以给他一个固定的大小
            4张图 2 * 2
            2,3,
            5,6,
            7,8,9
            任何问题都有并且至少有 2中解决思路: 一种是最笨的,一种是相对聪明的
        */
        
        guard let count = pic_urls?.count else {
            return CGSizeZero
        }
        
        if count == 1 {
            // 设置图片大小 有 2种方式
            // 第一种: 等图片下载完成之后,根据图片的大小返回size
            // 第二种: 后台把图片的大小返回给我们,我们设置好大小之后,异步下载图片 -- 瀑布流
            
            
            // 获取图片的url
            let key = pic_urls?.first?.model?.thumbnail_pic
            
            // 通过SD拿图片
           let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
            
            // 只是为了确保图片有值,如果没有值,我们就返回默认的一个宽高
            if image == nil {
                flowLayout.itemSize = CGSizeMake(HMPictureItemWH,HMPictureItemWH)
                return CGSizeMake(HMPictureItemWH, HMPictureItemWH)
            }
            // 返回的是 图片的大小,修改的也是 collectionView的大小
            // 但是 cell的大小改了吗?
            
            
            
            // 针对于一些图片,太窄的问题,可以设置一下 以宽度100为界线
            //
            var size = image.size
            if size.width < 100 {
                
//                size.width = 100
                // 我们再根据宽高比,设置一下高
                let height = 100 / size.width * size.height
                let width: CGFloat = 100
                size.height = height
                size.width = width
                
            }
            
            // 改变一下 flowLayout 的itemsize
            flowLayout.itemSize = size
            
            return size
            
//            return CGSizeMake(HMPictureItemWH, HMPictureItemWH)
        } else {
            // 由于cell存在重用的问题,我们需要把原来的itemSize再恢复成原来的
            flowLayout.itemSize = CGSizeMake(HMPictureItemWH,HMPictureItemWH)
        }
        
        if count == 4 {
            
            return CGSizeMake(HMPictureItemWH * 2 + HMPictureItemMargin, HMPictureItemWH * 2 + HMPictureItemMargin)
        }
        
        // 配图的宽度可以是一个固定值
        let row = (count - 1) / 3 + 1
        return CGSizeMake(UIScreen.mainScreen().bounds.width - 2 * HMPictrueViewMargin, (HMPictureItemMargin + HMPictureItemWH)*CGFloat(row))
        
//        return CGSizeMake(300, 200)
    }
}

//MARK:--数据源方法
extension HMPictureView: UICollectionViewDataSource,UICollectionViewDelegate{
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pic_urls?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(HMPictureViewReuseIdentifier, forIndexPath: indexPath) as! HMPictureCollectionViewCell
        
        cell.viewModel = pic_urls![indexPath.item]
        cell.backgroundColor = UIColor.redColor()
        
        return cell
        
    }
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        // 把图片数组以及 索引传递过去
        let userInfo = ["picurls": pic_urls!,"indexPath":indexPath]
        NSNotificationCenter.defaultCenter().postNotificationName(kNotificationPhotoBrower, object: nil, userInfo: userInfo)
        
    }
}

//MARK:-- 自定义Cell
class HMPictureCollectionViewCell: UICollectionViewCell{
    
//    var model: HMPhotoModel?
    var viewModel: HMPhotoViewModel?{
    
        didSet{

            iconImageView.sd_setImageWithURL(viewModel?.imageURL)
        }
        
    }
    
    // 第一步 -- 重写构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步 -- 定义一个方法,来实现 视图的添加和布局
    private func setupUI(){
        
        contentView.addSubview(iconImageView)
        
        // 设置约束
        iconImageView.snp_makeConstraints { (make) -> Void in
            
//            make.edges.equalTo(contentView.snp_edges)
            make.left.equalTo(contentView.snp_left)
            make.top.equalTo(contentView.snp_top)
            make.width.equalTo(contentView.snp_width)
            make.height.equalTo(contentView.snp_height)
            
        }
        
    }
    
    // 第三步: 懒加载控件
    private lazy var iconImageView: UIImageView = {
    
        let img = UIImageView()
        
        // 图片的填充模式
        // // default is UIViewContentModeScaleToFill
        /*
        public enum UIViewContentMode : Int {
        
        case ScaleToFill
        case ScaleAspectFit // contents scaled to fit with fixed aspect. remainder is transparent
        case ScaleAspectFill // contents scaled to fill with fixed aspect. some portion of content may be clipped.
        case Redraw // redraw on bounds change (calls -setNeedsDisplay)
        case Center // contents remain same size. positioned adjusted.
        case Top
        case Bottom
        case Left
        case Right
        case TopLeft
        case TopRight
        case BottomLeft
        case BottomRight
        }
        */
        img.contentMode = .ScaleToFill
        
        
        return img
    }()
    
}
